/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.unmsm.cinfo.siga.ui.utils;

import java.util.Arrays;
import pe.edu.unmsm.cinfo.siga.datos.Modulo;
import pe.edu.unmsm.cinfo.siga.datos.ModuloCurso;

/**
 *
 * @author lartkma
 */
public class ValidadorModulo {
    private Modulo modulo;
    private int indexCurso;
    private String mensaje = "";

    public ValidadorModulo(Modulo modulo) {
        this.modulo = modulo;
    }
    
    public boolean esValido(){
        if(!tieneNumerosOrdenValidos()){
            mensaje = "El curso " + modulo.getModuloCursoList().get(indexCurso).getCursoBase().getCurbNom() +
                    " no tiene un número de orden válido";
            return false;
        }else if(!tieneNumeroHorasValidos()){
            mensaje = "El curso " + modulo.getModuloCursoList().get(indexCurso).getCursoBase().getCurbNom() +
                    " no tiene un número de horas válido";
            return false;
        }else if(!tieneNumerosOrdenSecuenciales()){
            mensaje = "El orden de los cursos no sigue una secuencia válida";
            return false;
        }else{
            return true;
        }
    }
    
    private boolean tieneNumerosOrdenValidos(){
        if(modulo.getModuloCursoList() == null) return true;
        indexCurso = 0;
        for(ModuloCurso m : modulo.getModuloCursoList()){
            if(m.getModcOrd() < 1 || m.getModcOrd() > modulo.getModuloCursoList().size()) return false;
            indexCurso++;
        }
        return true;
    }
    
    private boolean tieneNumeroHorasValidos(){
        if(modulo.getModuloCursoList() == null) return true;
        indexCurso = 0;
        for(ModuloCurso m : modulo.getModuloCursoList()){
            if(m.getModcNhor() < 0) return false;
            indexCurso++;
        }
        return true;
    }
    
    private boolean tieneNumerosOrdenSecuenciales(){
        if(modulo.getModuloCursoList() == null || modulo.getModuloCursoList().isEmpty()) return true;
        boolean[] visitados = new boolean[modulo.getModuloCursoList().size()+1];
        Arrays.fill(visitados, false);
        visitados[0] = true;
        for(ModuloCurso m : modulo.getModuloCursoList()){
           if(m.getModcOrd() < 1 || m.getModcOrd() > modulo.getModuloCursoList().size()) return false;
           visitados[m.getModcOrd()] = true;
        }
        for(boolean visitado : visitados){
            if(!visitado) return false;
        }
        return true;
    }

    public String getMensaje() {
        return mensaje;
    }
}
